#define  _CRT_SECURE_NO_WARNINGS 1
//#include"head.h"

//int Add(int x, int y)
//{
//    return x + y;
//}
//
//char* test(int* x, char y)
//{
//	return NULL;
//}
//
//int main()
//{
//	//printf("&Add = %p\n", &Add);//&函数名也可以拿到函数地址
// //   printf("Add  = %p\n", Add);//函数名也是函数地址
//
//	int arr[6] = { 1,2,3,4,5,6 };
//	int(*pa)[6] = &arr;//pa是数组指针
//    printf("pa = %p\n", pa);
//
//	int(*pf)(int, int) = &Add;//pf是函数指针
//	//int(*)(int, int) --> 函数指针变量的类型
//	//指向函数的返回类型(*函数指针变量名)(指向函数的参数类型和个数的交代)
//    printf("pf = %p\n", pf);
//
//	char* (*pc)(int*, char) = &test;
//    printf("pc = %p\n", pc);
//
//	return 0;
//}

//=============================================

//int Add(int x, int y)
//{
//    return x + y;
//}
//
//int main()
//{
//    //int(*pf)(int, int) = &Add;
//    int(*pf)(int, int) = Add;//函数名也是函数地址
//    // Add 和 pf 是一样的
//    //int ret = (*pf)(10, 20);
//    //int ret = Add(10, 20);
//    int ret = pf(10, 20);
//    //* 有没有都可以，可以直接使用，实际上 * 跟摆设一样，定义时也是，一个多个都一样：int(******pf)(int, int) = Add;
//    printf("%d\n", ret);
//
//    return 0;
//}

//=============================================

//两段有趣的代码：

//int main()
//{
//	( *( void (*)() )0 )();
//	//void (*p)() -->p是函数指针变量
//	//void (*)() -->函数指针类型
//	//0 --> int
//	//( void (*)() )0 --> 0强制转换成函数指针类型 --> 将0当作一个地址
//	//解引用这个地址相当于调用这个函数
//	//上面的代码是一次函数调用，调用的是0这个地址处的函数。-->无参数，无返回值
//	
//	return 0;
//}


//下面的代码是一个函数声明
//void (*signal(int, void(*)(int)))(int);

//signal(int, void(*)(int)) --> signal: 函数名  (int, void(*)(int)): 函数参数类型
//void(*   )(int) --> 返回值类型
/*
声明的函数名字叫:signal
signal函数有2个参数，第一个参数的类型是int，第二个参数的类型是函数指针 void(*)(int)，这个函数指针能够指向的函数参数是int，返回类型是void
signal函数的返回值类型是函数指针 void(*)(int)，这个函数指针能够指向的函数参数是int，返回类型是void
*/




//如何简化上面的写法 --> typedef

//typedef unsigned int uint;
//typedef int* pint;
//
//int main()
//{
//	uint a = 10;
//	int b = 20;
//	pint p = &b;
//    printf("%d\n", a);
//    printf("%d\n", *p);
//
//	return 0;
//}


//typedef int* pint;
//int main()
//{
//	int* p1, p2;//p1是int* (指针)，p2是int
//	pint p3, p4;//p3，p4都是int* (指针)
//
//	return 0;
//}


//typedef 对数组指针和函数指针类型重命名
//
//typedef int(*)[6] parr; //error
//typedef int(*parr)[6];
//int main()
//{
//	int arr[6] = { 0 };
//	int(*pa)[6] = &arr;
//	//int(*)[6] pa = &arr; //error
//	printf("pa = %p\n", pa);
//
//    parr pb = &arr;
//    printf("pb = %p\n", pb);
//
//	return 0;
//}

//int Add(int x, int y)
//{
//    return x + y;
//}
//
//typedef int(*pf_a)(int, int);
//
//int main()
//{
//    int(*pf)(int, int) = &Add;
//    printf("pf = %p\n", pf);
//
//    pf_a pf1 = &Add;
//    printf("pa = %p\n", pf1);
//
//    return 0;
//}


//简化：
//void (*signal(int, void(*)(int)))(int);
//
//typedef void(*pfs)(int);
//pfs signal(int, pfs);

